package redis

import (
	"github.com/garyburd/redigo/redis"
	"github.com/rs/zerolog/log"
)

// GET 返回与键 key 相关联的字符串值。
func (db *Conn) GET(key string) string {
	res, err := redis.String(db.Conn.Do("GET", key))
	if err != nil {
		log.Error().Err(err).Str("key", key).Msg("redis GET 操作失败")
	}
	return res
}

// SET 将字符串值 value 关联到 key 。
// 如果 key 已经持有其他值， SET 就覆写旧值， 无视类型。  特别注意：无视类型覆盖
// 当 SET 命令对一个带有生存时间（TTL）的键进行设置之后， 该键原有的 TTL 将被清除。
func (db *Conn) SET(key, value string) error {
	_, err := db.Conn.Do("SET", key, value)
	if err != nil {
		log.Error().Err(err).Str("key", key).Str("value", value).Msg("redis SET 操作失败")
	}
	return err
}

// INCR 为键 key 储存的数字值加上一。
// 如果键 key 不存在， 那么它的值会先被初始化为 0 ， 然后再执行 INCR 命令。
// 如果键 key 储存的值不能被解释为数字， 那么 INCR 命令将返回一个错误。
// 本操作的值限制在 64 位(bit)有符号数字表示之内。
// 返回值: INCR 命令会返回键 key 在执行加一操作之后的值。
func (db *Conn) INCR(key string) int64 {
	res, err := redis.Int64(db.Conn.Do("INCR", key))
	if err != nil {
		log.Error().Err(err).Str("key", key).Msg("INCR操作错误")
	}
	return res
}

// INCRBY 为键 key 储存的数字值加上增量 increment 。
// 如果键 key 不存在， 那么键 key 的值会先被初始化为 0 ， 然后再执行 INCRBY 命令。
// 如果键 key 储存的值不能被解释为数字， 那么 INCRBY 命令将返回一个错误。
// 本操作的值限制在 64 位(bit)有符号数字表示之内。
// 返回值: 在加上增量 increment 之后， 键 key 的值。
func (db *Conn) INCRBY(key string, increment int64) int64 {
	res, err := redis.Int64(db.Conn.Do("INCRBY", key, increment))
	if err != nil {
		log.Error().Err(err).Str("key", key).Msg("INCRBY操作错误")
	}
	return res
}

// INCRBYFLOAT 为键 key 储存的值加上浮点数增量 increment 。
// 如果键 key 不存在， 那么 INCRBYFLOAT 会先将键 key 的值设为 0 ， 然后再执行加法操作。
// 如果命令执行成功， 那么键 key 的值会被更新为执行加法计算之后的新值， 并且新值会以字符串的形式返回给调用者。
// 无论加法计算所得的浮点数的实际精度有多长， INCRBYFLOAT 命令的计算结果最多只保留小数点的后十七位。
// 当以下任意一个条件发生时， 命令返回一个错误：
//     键 key 的值不是字符串类型(因为 Redis 中的数字和浮点数都以字符串的形式保存，所以它们都属于字符串类型）；
//     1.键 key 当前的值或者给定的增量 increment 不能被解释(parse)为双精度浮点数。
//
// 本操作的值限制在 64 位(bit)有符号数字表示之内。
// 返回值: 在加上增量 increment 之后， 键 key 的值。
func (db *Conn) INCRBYFLOAT(key string, increment float64) float64 {
	res, err := redis.Float64(db.Conn.Do("INCRBYFLOAT", key, increment))
	if err != nil {
		log.Error().Err(err).Str("key", key).Float64("increment", increment).Msg("INCRBYFLOAT操作错误")
	}
	return res
}
